#ifndef _WX_CALCTRL_H_
#define _WX_CALCTRL_H_

#include "wx/defs.h"

#if wxUSE_CALENDARCTRL

#include "wx/dateevt.h"
#include "wx/colour.h"
#include "wx/font.h"

enum {
  wxCAL_SUNDAY_FIRST               = 0x0000,
  wxCAL_MONDAY_FIRST               = 0x0001,
  wxCAL_SHOW_HOLIDAYS              = 0x0002,
  wxCAL_NO_YEAR_CHANGE             = 0x0004,
  wxCAL_NO_MONTH_CHANGE            = 0x000c,
  wxCAL_SEQUENTIAL_MONTH_SELECTION = 0x0010,
  wxCAL_SHOW_SURROUNDING_WEEKS     = 0x0020
};

enum wxCalendarHitTestResult {
  wxCAL_HITTEST_NOWHERE,
  wxCAL_HITTEST_HEADER,
  wxCAL_HITTEST_DAY,
  wxCAL_HITTEST_INCMONTH,
  wxCAL_HITTEST_DECMONTH,
  wxCAL_HITTEST_SURROUNDING_WEEK
};


enum wxCalendarDateBorder {
  wxCAL_BORDER_NONE,
  wxCAL_BORDER_SQUARE,
  wxCAL_BORDER_ROUND
};

class wxCalendarDateAttr {
  protected:
    void Init( wxCalendarDateBorder border = wxCAL_BORDER_NONE ) {
      m_border = border;
      m_holiday = false;
    }
  public:

    wxCalendarDateAttr() { Init(); }
    wxCalendarDateAttr( const wxColour& colText,
                        const wxColour& colBack = wxNullColour,
                        const wxColour& colBorder = wxNullColour,
                        const wxFont& font = wxNullFont,
                        wxCalendarDateBorder border = wxCAL_BORDER_NONE )
      : m_colText( colText ), m_colBack( colBack ),
        m_colBorder( colBorder ), m_font( font ) {
      Init( border );
    }
    wxCalendarDateAttr( wxCalendarDateBorder border,
                        const wxColour& colBorder = wxNullColour )
      : m_colBorder( colBorder ) {
      Init( border );
    }

    void SetTextColour( const wxColour& colText ) { m_colText = colText; }
    void SetBackgroundColour( const wxColour& colBack ) { m_colBack = colBack; }
    void SetBorderColour( const wxColour& col ) { m_colBorder = col; }
    void SetFont( const wxFont& font ) { m_font = font; }
    void SetBorder( wxCalendarDateBorder border ) { m_border = border; }
    void SetHoliday( bool holiday ) { m_holiday = holiday; }
    bool HasTextColour() const { return m_colText.Ok(); }
    bool HasBackgroundColour() const { return m_colBack.Ok(); }
    bool HasBorderColour() const { return m_colBorder.Ok(); }
    bool HasFont() const { return m_font.Ok(); }
    bool HasBorder() const { return m_border != wxCAL_BORDER_NONE; }
    bool IsHoliday() const { return m_holiday; }
    const wxColour& GetTextColour() const { return m_colText; }
    const wxColour& GetBackgroundColour() const { return m_colBack; }
    const wxColour& GetBorderColour() const { return m_colBorder; }
    const wxFont& GetFont() const { return m_font; }
    wxCalendarDateBorder GetBorder() const { return m_border; }
  private:
    wxColour m_colText,
    m_colBack,
    m_colBorder;
    wxFont   m_font;
    wxCalendarDateBorder m_border;
    bool m_holiday;
};

class wxCalendarCtrl;

class wxCalendarEvent : public wxDateEvent {
    friend class wxCalendarCtrl;
  public:
    wxCalendarEvent() { Init(); }
    inline wxCalendarEvent( wxCalendarCtrl *cal, wxEventType type );

    void SetWeekDay( const wxDateTime::WeekDay wd ) { m_wday = wd; }
    wxDateTime::WeekDay GetWeekDay() const { return m_wday; }

  protected:
    void Init() {
      m_wday = wxDateTime::Inv_WeekDay;
    }

  private:
    wxDateTime::WeekDay m_wday;

    DECLARE_DYNAMIC_CLASS_NO_COPY( wxCalendarEvent )
};

#include "wx/generic/calctrl.h"

inline wxCalendarEvent::wxCalendarEvent( wxCalendarCtrl *cal, wxEventType type )
  : wxDateEvent( cal, cal->GetDate(), type ) {
}





BEGIN_DECLARE_EVENT_TYPES()
DECLARE_EXPORTED_EVENT_TYPE( wxEVT_CALENDAR_SEL_CHANGED, 950 )
DECLARE_EXPORTED_EVENT_TYPE( wxEVT_CALENDAR_DAY_CHANGED, 951 )
DECLARE_EXPORTED_EVENT_TYPE( wxEVT_CALENDAR_MONTH_CHANGED, 952 )
DECLARE_EXPORTED_EVENT_TYPE( wxEVT_CALENDAR_YEAR_CHANGED, 953 )
DECLARE_EXPORTED_EVENT_TYPE( wxEVT_CALENDAR_DOUBLECLICKED, 954 )
DECLARE_EXPORTED_EVENT_TYPE( wxEVT_CALENDAR_WEEKDAY_CLICKED, 955 )
END_DECLARE_EVENT_TYPES()

typedef void ( wxEvtHandler::*wxCalendarEventFunction )( wxCalendarEvent& );

#define wxCalendarEventHandler(func) \
  (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCalendarEventFunction, &func)

#define wx__DECLARE_CALEVT(evt, id, fn) \
  wx__DECLARE_EVT1(wxEVT_CALENDAR_ ## evt, id, wxCalendarEventHandler(fn))

#define EVT_CALENDAR(id, fn) wx__DECLARE_CALEVT(DOUBLECLICKED, id, fn)
#define EVT_CALENDAR_SEL_CHANGED(id, fn) wx__DECLARE_CALEVT(SEL_CHANGED, id, fn)
#define EVT_CALENDAR_DAY(id, fn) wx__DECLARE_CALEVT(DAY_CHANGED, id, fn)
#define EVT_CALENDAR_MONTH(id, fn) wx__DECLARE_CALEVT(MONTH_CHANGED, id, fn)
#define EVT_CALENDAR_YEAR(id, fn) wx__DECLARE_CALEVT(YEAR_CHANGED, id, fn)
#define EVT_CALENDAR_WEEKDAY_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEKDAY_CLICKED, id, fn)

#endif

#endif

